package com.wzz.common.security;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class DES {

  /*
   * 发现Android DES 加密和java DES加密的程序不能互通 原因： 
   * 
   * 调用DES加密算法包最精要的就是下面两句话：
   * 
   * Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
   * cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv); CBC是工作模式，
   * DES一共有电子密码本模式（ECB）、加密分组链接模式（CBC）、加密反馈模式（CFB）和输出反馈模式（OFB）四种模式，
   * 
   * PKCS5Padding是填充模式，还有其它的填充模式： 然后，cipher.init（)一共有三个参数：
   * 
   * Cipher.ENCRYPT_MODE, key, zeroIv，
   * 
   * zeroIv就是初始化向量，一个8为字符数组。
   * 
   * 工作模式、填充模式、初始化向量这三种因素一个都不能少。
   * 不指定的话，那么就要程序就要调用默认实现。
   */

  private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };

  public static String encrypt(String encryptString, String encryptKey) throws Exception {
    // IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
    IvParameterSpec zeroIv = new IvParameterSpec(iv);
    SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
    byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
    return Base64.encode(encryptedData);
  }

  public static String decrypt(String decryptString, String decryptKey) throws Exception {
    byte[] byteMi = Base64.decode(decryptString);
    IvParameterSpec zeroIv = new IvParameterSpec(iv);
    // IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
    SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
    byte decryptedData[] = cipher.doFinal(byteMi);
    return new String(decryptedData);
  }
}
